const express = require('express')
const mongoose = require('mongoose')
const bodyParser = require('body-parser')
const cookieParser = require('cookie-parser')
const jwt = require('jsonwebtoken')
const bcrypt = require('bcrypt')
const path = require('path')
const cors = require('cors')
const helmet = require('helmet')
const rateLimit = require('express-rate-limit')

// 创建Express应用
const app = express()

// 中间件配置
app.use(helmet()) // 添加安全HTTP头
app.use(cors()) // 启用CORS
app.use(bodyParser.json({ limit: '1mb' })) // 限制请求体大小
app.use(bodyParser.urlencoded({ extended: true, limit: '1mb' }))
app.use(cookieParser())

// 限制请求频率，防止暴力攻击
const apiLimiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15分钟
  max: 100, // 每个IP在windowMs内最多100个请求
  standardHeaders: true,
  legacyHeaders: false,
  message: {
    success: false,
    message: '请求过于频繁，请稍后再试'
  }
})

// 对认证路由应用限制
app.use('/auth', apiLimiter)

// 连接MongoDB数据库
const connectDB = async () => {
  try {
    // 使用环境变量或默认连接字符串
    const mongoURI = process.env.MONGO_URI || 'mongodb://localhost:27017/login-system'
    await mongoose.connect(mongoURI, {
      useNewUrlParser: true,
      useUnifiedTopology: true,
      serverSelectionTimeoutMS: 5000, // 超时设置
      socketTimeoutMS: 45000, // 套接字超时
      family: 4 // 强制使用IPv4
    })
    console.log('MongoDB连接成功')
  } catch (err) {
    console.error('MongoDB连接失败:', err.message)
    // 如果是严重错误，可以退出进程
    process.exit(1)
  }
}

// 调用数据库连接函数
connectDB()

// 导入路由
const authRoutes = require('./routes/auth')
const userRoutes = require('./routes/user')

// 使用路由
app.use('/auth', authRoutes)
app.use('/user', userRoutes)

// 404错误处理
app.use((req, res, next) => {
  res.status(404).json({
    success: false,
    message: '请求的资源不存在'
  })
})

// 全局错误处理中间件
app.use((err, req, res, next) => {
  // 记录错误详情
  console.error(`[${new Date().toISOString()}] ${req.method} ${req.url}`, err)
  
  // 根据环境返回不同的错误信息
  const statusCode = err.statusCode || 500
  res.status(statusCode).json({
    success: false,
    message: err.message || '服务器内部错误',
    error: process.env.NODE_ENV === 'development' ? {
      stack: err.stack,
      details: err.details
    } : undefined
  })
})

// 导出Express实例供Nuxt使用
module.exports = app

// 如果直接运行此文件，则监听端口
if (require.main === module) {
  const PORT = process.env.PORT || 3000
  const server = app.listen(PORT, () => {
    console.log(`API服务器运行在端口 ${PORT}`)
  })
  
  // 优雅关闭服务器
  const gracefulShutdown = () => {
    console.log('正在关闭服务器...')
    server.close(() => {
      console.log('服务器已关闭')
      mongoose.connection.close(false, () => {
        console.log('MongoDB连接已关闭')
        process.exit(0)
      })
    })
    
    // 如果10秒内没有关闭，强制退出
    setTimeout(() => {
      console.error('无法正常关闭，强制退出')
      process.exit(1)
    }, 10000)
  }
  
  // 监听进程信号
  process.on('SIGTERM', gracefulShutdown)
  process.on('SIGINT', gracefulShutdown)
}